<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title></title>
	</head>
	<body>
		<hr>
	</body>
	<script>
		// let a=[];
		// for(let i=0;i<10;i++){
		// 	a[i]=function(){
		// 		console.log(i);
		// 	}
		// }
		// a[6]();//6,因为每次循环会有一个新的i被创建
		for(let i=0;i<10;i++){ 
			let i=2
			// console.log(i)
		}//for会有一个父级作用域，循环体内是一个新的块级作用域，作用域是单独的
		{
			let a=1
			{
				let a=2//如果我有这行代码，那么输出的是2，我没有这行代码输出的是1，这不应该是两个单独的作用域嘛，那么没有这行代码为什么不是输出undefined呢
				//同java的局部变量和全局变量，在局部找到变量之后，引擎就不会去上一层级寻找了，所以不会存在let重复定义的问题
				// console.log(a)
				// console.log(a)
			}
		} 
		var tmp = new Date();
		function f() {
		  console.log(tmp);
		  if (false) {
		    var tmp = 'hello world';
		  }
		   console.log(tmp);
		}
		f(); 
		 console.log(tmp);
		let m=1;//如果没有这个分号，js会把下面的语句解析为let m=1({m}={m:100})，导致报错（TDZ错误，就是暂时性死区，就是Uncaught ReferenceError
		//因为在{m}={m:100}的时候，会将右边对象的m的值，赋值到左边的变量m中，而这个赋值操作，是在let m这个初始化语句未完成之前发生的（也就是初始化中）所以报错
		({m}={m:100})
		console.log(m)
		let {0:first,[1]:secend}=["a","b"]
		console.log(first,secend)
		
		
		let f3 = a => {return a+1}
		let [a,b]=[4,4]
		let f2 = (a,b)=> {return a+b} 
		console.log(f2(1,2),a)
		
		
		let arr = [{i:1},{i:2},{i:3}]
		let target = {i:1}
		console.log(arr.includes(target))//判断的是地址，各种类型都可以
		console.log(arr.find((tar)=>target.i==tar.i))//如果没找到返回undefined
		console.log(arr.some(tar=>target.i==tar.i))//判断是否至少一个元素通过了函数测试
		console.log(arr.filter(tar=>target.i==tar.i))//保留满足函数测试的元素
	</script> 
</html>
